package com.ksd.web.controller.system;

// 假设这些是已有的导入
import com.ksd.common.config.PlayControlConfig;
import com.ksd.common.core.controller.BaseController;
import com.ksd.common.core.domain.AjaxResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@RestController
public class ExcelFileController extends BaseController {

    private static final Logger logger = LoggerFactory.getLogger(ExcelFileController.class);
    // 获取根目录下的Excel文件和文件夹（第一层级）
    @GetMapping("/usb/files")
    public AjaxResult getFiles() {
        // 指定根目录路径
        String rootPath = PlayControlConfig.getUsbDiskPath();
        logger.info("获取USB硬盘内的Excel文件目录: " + rootPath);

        File rootDirectory = new File(rootPath);
        List<FileNode> nodes = new ArrayList<>();

        if (rootDirectory.exists() && rootDirectory.isDirectory()) {
            // 递归构建文件树，只包含Excel文件和它们的父文件夹
            buildExcelFileTree(rootDirectory, nodes, true);
        }

        return AjaxResult.success(nodes);
    }

    // 根据路径获取指定目录下的Excel文件和子文件夹
    @PostMapping("/usb/filesByPath")
    public AjaxResult getFilesByPath(@Validated @RequestBody FileNode fileNode) {
        logger.info("获取路径下的Excel文件: " + fileNode.getPath());

        File directory = new File(fileNode.getPath());
        List<FileNode> nodes = new ArrayList<>();

        if (directory.exists() && directory.isDirectory()) {
            // 构建当前目录下的文件树，不进行顶层筛选（因为父节点已经被筛选过）
            buildExcelFileTree(directory, nodes, false);
        }

        return AjaxResult.success(nodes);
    }

    /**
     * 递归构建只包含Excel文件的文件树
     * @param directory 当前目录
     * @param nodes 要填充的节点列表
     * @param topLevel 是否为顶层目录（需要筛选）
     */
    private void buildExcelFileTree(File directory, List<FileNode> nodes, boolean topLevel) {
        File[] files = directory.listFiles();
        if (files == null) {
            return;
        }

        for (File file : files) {
            // 如果是目录，检查是否包含Excel文件，有则添加目录节点
            if (file.isDirectory()) {
                // 检查目录是否包含Excel文件（递归）
                boolean hasExcelFiles = hasExcelFiles(file);
                if (!topLevel || hasExcelFiles) {
                    FileNode node = createFileNode(file);
                    // 为目录节点添加子节点（只包含Excel文件和有Excel的子目录）
                    List<FileNode> children = new ArrayList<>();
                    buildExcelFileTree(file, children, false);
                    node.setChildren(children);
                    nodes.add(node);
                }
            }
            // 如果是文件，检查是否为Excel文件
            else if (isExcelFile(file)) {
                FileNode node = createFileNode(file);
                nodes.add(node);
            }
        }
    }

    /**
     * 检查目录是否包含Excel文件（递归检查子目录）
     */
    private boolean hasExcelFiles(File directory) {
        File[] files = directory.listFiles();
        if (files == null) {
            return false;
        }

        for (File file : files) {
            if (file.isDirectory()) {
                if (hasExcelFiles(file)) {
                    return true;
                }
            } else if (isExcelFile(file)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断文件是否为Excel文件（.xls或.xlsx）
     */
    private boolean isExcelFile(File file) {
        String fileName = file.getName().toLowerCase();
        return fileName.endsWith(".xls") || fileName.endsWith(".xlsx");
    }

    /**
     * 创建文件节点
     */
    private FileNode createFileNode(File file) {
        FileNode node = new FileNode();
        node.setId(UUID.randomUUID().toString());
        node.setName(file.getName());
        node.setPath(file.getAbsolutePath());
        node.setLeaf(!file.isDirectory()); // 文件是叶子节点，目录不是
        return node;
    }

    // 假设的FileNode类
    public static class FileNode {
        private String id;
        private String name;
        private String path;
        private boolean leaf;
        private List<FileNode> children;

        // getter和setter方法
        public String getId() { return id; }
        public void setId(String id) { this.id = id; }
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public String getPath() { return path; }
        public void setPath(String path) { this.path = path; }
        public boolean isLeaf() { return leaf; }
        public void setLeaf(boolean leaf) { this.leaf = leaf; }
        public List<FileNode> getChildren() { return children; }
        public void setChildren(List<FileNode> children) { this.children = children; }
    }
}

